import type { AxiosError, AxiosInstance, AxiosRequestConfig } from 'axios';
import { AxiosHeaders } from 'axios';
interface newConfig extends AxiosRequestConfig {
  // 设置重复请求次数
  retry?: number;
  // 请求次数
  __retryCount?: number;
}
// 判断一个字符串是否为JSON字符串
export let isJsonStr = (str: string) => {
  if (typeof str == 'string') {
    try {
      var obj = JSON.parse(str);
      if (typeof obj == 'object' && obj) {
        return true;
      } else {
        return false;
      }
    } catch (e) {
      return false;
    }
  }
  return;
};
// 请求重试
export async function requestAgainSend(
  err: AxiosError<any, any> & newConfig,
  axios: AxiosInstance,
) {
  let config = err.config as any;
  // config.retry 具体接口配置的重发次数
  if (!config || !config.retry) return Promise.reject(err);
  console.log(config);

  // 设置用于记录重试计数的变量 默认为0
  config.__retryCount = config.__retryCount || 0;

  // 判断是否超过了重试次数
  if (config.__retryCount >= config.retry) {
    return Promise.reject(err);
  }
  // 重试次数
  config.__retryCount += 1;

  // 延时处理
  var backoff = new Promise(function (resolve) {
    setTimeout(function () {
      resolve('');
    }, config.retryDelay || 1000);
  });
  // 重新发起axios请求
  return backoff.then(function () {
    // 判断是否是JSON字符串
    // TODO: 未确认config.data再重发时变为字符串的原因
    if (config.data && isJsonStr(config.data)) {
      config.data = JSON.parse(config.data);
    }
    // debugger;
    config.headers = new AxiosHeaders(config.headers);
    return axios(config);
  });
}
